#include <iostream>
#include <string>
#include <unordered_map>
#include <memory>
#include <functional>
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/TcpConnection.h>
#include <muduo/base/Atomic.h>

class dictServer
{
public:
    dictServer()
        :_dictserver(&_loop, muduo::net::InetAddress("0.0.0.0", 9090),
                        "dictserver", muduo::net::TcpServer::Option::kReusePort)  // 最后一个参数的意思是是否开启地址复用
    {
        // 设置这几个必须要的函数
        _dictserver.setConnectionCallback(std::bind(&dictServer::connectionCallBack, this, std::placeholders::_1));
        _dictserver.setMessageCallback(std::bind(&dictServer::messageCallBack, this, 
            std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
        // 给字典插入数据 随便插入几个单词进行test实验
        _dictmap["hello"] = "你好";
        _dictmap["world"] = "世界";
        _dictmap["apple"] = "苹果";
    }
    void running()
    {
        // 启动tcp服务和事件循环监控loop服务
        _dictserver.start();
        _loop.loop();
    }
    ~dictServer(){}
private:
    void connectionCallBack(const muduo::net::TcpConnectionPtr& conn)
    {
        // 判断是否连接成功
        if(conn->connected())
        {
            std::cout << "连接成功!" << std::endl;
        }
        else
        {
            std::cout << "连接失败!" << std::endl;
        }
    }
    void messageCallBack(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buf, muduo::Timestamp time)
    {
        // 取出来buf里面的数据 进行查询 因为我们没有定制其他协议 这里如果收到客户端发来的一个单词直接全部取出来进行操作
        std::string str = buf->retrieveAllAsString();
        // 对这个单词进行查询
        auto it = _dictmap.find(str);
        std::string msg;
        if(it != _dictmap.end())
        {
            // 找到了数据
            msg = (*it).second;
        }
        else
        {
            msg = "None";
        }
        // 把查询到的数据发送给客户端
        conn->send(msg);
    }
private:
    // 因为需要现有 eventloop对象才可以初始化tcpserver对象 所以eventloop对象应在tcpserver上面 这样初始化列表才会正确
    muduo::net::EventLoop _loop;
    muduo::net::TcpServer _dictserver;
    std::unordered_map<std::string, std::string> _dictmap;
};


int main()
{
    dictServer dict;
    // 启动服务端
    dict.running();


    return 0;
}
